/**
 * WangSong 2009-9-29 增加gerProperty方法，从属性文件中获取参数
 */
package cn.biplam.common.client;

import java.rmi.Naming;

import cn.biplam.common.interfaces.ConfigServer;
import cn.biplam.common.paramters.SysName;
import cn.biplam.common.paramters.index.ConfigParamIndex;
import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * 系统常量配置类客户端
 * @author WangSong
 * @create Mar 5, 2009 6:30:08 PM
 * @version 1.0 
 */
public abstract class Config {

	/**系统配置参数容器(来自系统参数表)*/
	private static KvMap<String,String> kvConfig;
	/**系统属性参数容器(来自系统配置文件)*/
	private static KvMap<String,String> kvProperties;
	
	/**
	 * 取本地配置文件参数
	 * @param sName
	 * @return String
	 * @throws ErrorMessage
	 */
	public static String getProperte(String sName) throws ErrorMessage{
		String sValue;
		if(kvProperties==null)
			kvProperties=TOOLS.getValueByProperty(SysName.PropertiesPath);
		sValue=kvProperties.getByKey(sName);
		if(sValue==null || sValue==""){
			throw new ErrorMessage("Property paramete name is null!("+sName+")");
		}
		return sValue;
	}
	
	/**
	 * 取指定配置参数信息
	 * @param name  	参数名称
	 * @return 			String 参数信息
	 * @throws ErrorMessage 
	 */
	public static String get(String sName) throws ErrorMessage{
		String sValue;
		if(kvConfig==null){
			refresh();
		}
		if(sName==null){
			throw new ErrorMessage("Config paramete name is null!");
		}
		sValue=kvConfig.getByKey(sName);
		if(sValue==null){
			throw new ErrorMessage("Config paramete not found!("+sName+")");
		}
		return sValue;
	}
	
	/**
	 * 从服务器端刷新配置信息
	 * @throws ErrorMessage 
	 */
	public static void refresh() throws ErrorMessage{
		try {
			//初始化服务器接口
			StringBuilder sb=new StringBuilder();
			sb.append("rmi://");
			sb.append(getProperte(ConfigParamIndex.ConfigServer_Address));
			sb.append(':');
			sb.append(getProperte(ConfigParamIndex.ConfigServer_Port));
			sb.append('/');
			sb.append(getProperte(ConfigParamIndex.ConfigSevice_Name));
			ConfigServer cs = (ConfigServer)Naming.lookup(sb.toString());
			kvConfig = cs.getConfigGroup();
		} catch (ErrorMessage e){
			throw e;
		} catch (Exception e) {
			throw new ErrorMessage(e,"Get ConfigServer instance failed!");
		}
	}
	
	/**
	 * 本地更新系统参数(用于测试及性能调优)
	 * @param sParamName
	 * @param sParamValue
	 * @throws ErrorMessage
	 */
	public static void localUpdate(String sParamName,String sParamValue ) throws ErrorMessage{
		
		if(kvConfig==null){
			refresh();
		}
		kvConfig.put(sParamName,sParamValue);
	}
	
}
